package main

import (
	"fmt"
	"log"
	"net/http"
)

/*
Go语言内置了 net/http库，封装了HTTP网络编程的基础的接口，
我们实现的Gee Web 框架便是基于net/http的。我们接下来通过一个例子，
简单介绍下这个库的使用。
*/

//设置了2个路由，/和/hello，分别绑定 indexHandler 和 helloHandler ， 根据不同的HTTP请求会调用不同的处理函数。
func main() {
	http.HandleFunc("/", indexHandler)
	http.HandleFunc("/hello", helloHandler)
	log.Fatal(http.ListenAndServe(":9999", nil))
}

/*
http.ListenAndServe(":9999", nil)

main 函数的最后一行，是用来启动 Web 服务的，第一个参数是地址，:9999表示在 9999 端口监听。
而第二个参数则代表处理所有的HTTP请求的实例，nil 代表使用标准库中的实例处理。
第二个参数，则是我们基于net/http标准库实现Web框架的入口。
*/

/*
实现http.Handler接口:

package http
type Handler interface {
    ServeHTTP(w ResponseWriter, r *Request)
}
func ListenAndServe(address string, h Handler) error

第二个参数的类型是什么呢？通过查看net/http的源码可以发现，Handler是一个接口，需要实现方法 ServeHTTP ，也就是说，只要传入任何实现了 ServerHTTP 接口的实例，所有的HTTP请求，就都交给了该实例处理了。

*/

// handler echoes r.URL.Path
func indexHandler(w http.ResponseWriter, req *http.Request) {
	fmt.Fprintf(w, "URL.Path = %q\n", req.URL.Path)
}

// handler echoes r.URL.Header
func helloHandler(w http.ResponseWriter, req *http.Request) {
	for k, v := range req.Header {
		fmt.Fprintf(w, "Header[%q] = %q\n", k, v)
	}
}
